var express = require('express');
var app = express();

app.engine('jade', require('jade').__express);
app.set('view engine','jade');
app.set('views','./views');

app.get('/',function(req,res) {
    res.render('index',{
        title:'Hey',
        message:'Hello there!'
    });
});

app.listen(8000);


// var express = require('express');
// var app = express();

// //加载模板
// var swig = require('swig');

//第一个参数模板引擎名称，同时也是模板文件的后缀
//第二个参数标识用于解析处理模板内容的方法
// app.engine('html',swig.renderFile);
// //设置模板文件存放的目录，第一个参数必须是views，第二个参数是目录
// app.set('views','./views');

// //注册所使用的模板引擎，第一个参数必须是view engine，第二个参数和app.engine这个方法定义的模板引擎的名称（第一个参数）是一致的
// app.set('view engine','html');

// //取消模板缓存
// swig.setDefaults({cache:false});

// app.get('/a', function(req, res, next) {
//     res.send('sucess');
//     // next();
// });

// // catch 404 and forward to error handler
// app.use(function(req, res, next) {
//   console.log(404);
//   var err = new Error('Not Found');
//   err.status = 404;
//   next(err);
// });

// app.use(function(err, req, res, next) {
//   res.status(err.status || 500);
//   res.render('error', {
//     message: err.message,
//     error: {}
//   });
// });

// app.listen(8080);


// var express = require('express');
// var app = express();

// app.use(function(req,res,next) {
//     console.log('Time:',Date.now());
//     next();
// });


// app.use('/user/:id',function(req,res,next) {
//     console.log('Request Type:',req.method);
//     next();
// });

// app.get('/user/:id',function(req,res) {
//     res.send('USER');
// });


// app.use('/user/:id',function(req,res,next) {
//     console.log('Request URL:',req.originalUrl);
//     // next();
// },function(req,res,next) {
//     console.log('Request Type:',req.method);
//     var err = new Error('Not Found');
//     err.status = 404;
//     next(err);
//     // next("route");
// });

// app.get('/user/:id',function(req,res) {
//     // res.send('USER');
//     console.log("hello");
// });

// app.get(function(err,req,res,next) {
//     console.log('这是一个错误的页面');
// });

// app.get('/user/:id',function(req,res,next) {
//     console.log('ID:',req.params.id);
//     next();
// },function(req,res,next) {
//     res.send('User Info');
// });

// app.get('/user/:id',function(req,res,next) {
//     res.send(req.params.id);
// });


// app.get('/user/:id',function(req,res,next) {
//     if(req.params.id == 0) {
//         next('route');
//     } else {
//         next();
//     }
// },function(req,res,next) {
//     console.log('regular');
//     // res.render('regular');
// });

// app.get('/user/:id',function(req,res,next) {
//     console.log('test');
//     next();
//     // res.render('special');
// });

// app.get('/user/:id',function(req,res,next) {
//     console.log('special');
//     // res.render('special');
// });



// var router = express.Router();

// router.use(function(req,res,next) {
//     console.log('Time:',Date.now());
//     next();
// });

// router.use('/user/:id',function(req,res,next) {
//     console.log('Request URL:',req.originalUrl);
//     next();
// },function(req,res,next) {
//     console.log('Request Type:',req.method);
//     next();
// });


// router.get('/user/:id',function(req,res,next) {
//     if(req.params.id == 0) {
//         next('route');
//     } else {
//         next();
//     }
// },function(req,res,next) {
//     console.log('regular');
//     // res.render('regular');
// });

// router.get('/user/:id',function(req,res,next) {
//     console.log(req.params.id);
//     console.log('special');
// });

// app.use('/',router);



// app.listen(8000);








// global.a = 100;
// var a = 100;

// module.exports = a;

// var p = new Promise(function(resolve,reject) {
//     setTimeout(function() {
//         console.log('执行完成');
//         resolve('随便什么数据');
//     },2000);
// });


// function runAsync1() {
//     var p = new Promise(function(resolve,reject) {
//         setTimeout(function() {
//             // console.log('执行完成1');
//             resolve('随便什么数据1');
//         },2000);
//     });
//     return p;
// }

// function runAsync2() {
//     var p = new Promise(function(resolve,reject) {
//         setTimeout(function() {
//             // console.log('执行完成2');
//             resolve('随便什么数据2');
//         },2000);
//     });
//     return p;
// }

// function runAsync3() {
//     var p = new Promise(function(resolve,reject) {
//         setTimeout(function() {
//             // console.log('执行完成3');
//             resolve('随便什么数据3');
//         },2000);
//     });
//     return p;
// }

// Promise.all([runAsync1(),runAsync2(),runAsync3()]).then(function(results) {
//     console.log(results);
// });

// // runAsync1().then(function(data) {
// //     console.log(data);
// // });
// runAsync1().then(function(data) {
//     console.log(data);
//     return runAsync2();
// }).then(function(data) {
//     console.log(data);
//     return runAsync3();
// }).then(function(data) {
//     console.log(data);
// });

// function getNumber() {
//     var  p = new Promise(function(resolve,reject) {
//         setTimeout(function() {
//             var num = Math.ceil(Math.random() * 10);
//             if(num <=5) {
//                 resolve(num);
//             } else {
//                 reject('数字太大了');
//             }
//         },2000);
//     });
//     return p;
// }


// getNumber().then(function(data) {
//     console.log('resolved');
//     console.log(data);
// },
//     function(reason,data) {
//     console.log('rejected');
//     console.log(reason);
// });


// getNumber().then(function(data) {
//     console.log('resolved');
//     console.log(data);
//     console.log(somedata);
// }).catch(function(reason) {
//     console.log('rejected');
//     console.log(reason);
// });








// var fs = require('fs');

// function copy(src,dst) {
//     // fs.writeFileSync(dst,fs.readFileSync(src));
//     fs.createReadStream(src).pipe(fs.createWriteStream(dst));
// }

// function main(argv) {
//     copy(argv[0],argv[1]);
// }

// main(process.argv.splice(2));
// console.log(process.argv.splice(2));

// var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
// var dup = new Buffer(bin.length);

// bin.copy(dup);
// dup[0] = 0x48;
// var bin = new Buffer([ 0x68, 0x65, 0x6c, 0x6c, 0x6f ]);
// console.log(bin); // => <Buffer 68 65 6c 6c 6f>
// console.log(dup); // => <Buffer 48 65 65 6c 6f>

// var fs  = require("fs");

// var pathname = process.argv[1];

// var rs = fs.createReadStream(pathname);

// rs.on('data',function(chunk) {
//     console.log(chunk.toString());
// });

// rs.on('end',function() {
//     console.log("结束了");
// });

// console.log(pathname);

// var a = new Promise(
//   function(resolve, reject) {
//     console.log(1)
//     setTimeout(() => console.log(2), 0)
//     console.log(3)
//     console.log(4)
//     resolve(true)
//   }
// )
// a.then(v => {
//   console.log(8)
// })
// var b = new Promise(
//   function() {
//     console.log(5)
//     setTimeout(() => console.log(6), 0)
//   }
// )
// console.log(7)

// var cache = {};

// function store(key,value) {
//     cache[path.normalize(key)] = value;
// }

// store('foo/bar',1);
// store('foo//baz//../bar',2);
// console.log(cache);
// util = require('util');

// function log() {
//     process.stdout.write(
//         util.format.apply(util,arguments) + '\n');
// }

// log();

// function  counter(n) {
//     var count = 0,i,j;

//     for(i = n;i>0;--i) {
//         for(j=n;j>0;--j) {
//             count += 1;
//         }
//     }

// }

// var t = new Date();

// setTimeout(function() {
//     console.log(new Date() - t);
// },1000);

// counter(50000);

// counter(10000,function(count) {
//     console.log(count);
// });

// console.log('hello world');


// setTimeout(function() {
//     console.log('world');
// },1000);

// console.log('hello');

// function sync(fn) {
//     return fn();
// }

// try{
//     sync(null);
// } catch (err) {
//     console.log('Error: %s',err.message);
// }

// function async(fn, callback) {
//     // Code execution path breaks here.
//     setTimeout(function ()　{
//         try {
//             callback(null, fn());
//         } catch (err) {
//             callback(err);
//         }
//     }, 0);
// }

// async(null, function (err, data) {
//     if (err) {
//         console.log('Error: %s', err.message);
//     } else {
//         // Do something.
//     }
// });

// process.on('uncaughtException',function(err) {
//     console.log('haha Error: %s',err.message);
// });

// setTimeout(function(fn) {
//     fn();
// });

// var fs = require('fs');
// var path = require('path');
// var http = require('http');

// var MIME = {
//     '.css'=>'text/css',
//     '.js'=>'application/javascript'
// };

// function combineFiles(pathname,callback) {
//     var output = [];

//     (function next(i,len) {
//         if(i < len) {
//             fs.readFile(pathname[i],function(err,data) {
//                 if(err) {
//                     callback(err);
//                 } else {
//                     output.push(data);
//                     next(i + 1,len);
//                 }
//             });
//         } else {
//             callback(null,Buffer,concat(output));
//         }
//     }(0,pathnames.length);
// }

// function main(argv) {
//     var config = JSON.parse(fs.readFileSync(argv[0],'utf-8'));
//     var root = config.root || '.';
//     var port = config.root || 80;

//     http.createServer(function (request,response) {
//         var urlInfo = parseURL(root,request.url);

//         combineFiles(urlInfo.pathnames,function(err,data) {
//             if(err) {
//                 response.writeHead(404);
//                 response.end(err.message);
//             } else {
//                 response.writeHead(200,{'Content-Type':urlInfo.mime});
//             }
//         });
//     }).listen(port);
// }

// function parseURL(root,url) {
//     var base,pathname,parts;

//     if(url.indexOf('??') === -1) {
//         url = url.replace('/','/??');
//     }

//     parts = url.split('??');
//     base = parts[0];
//     pathnames  = parts[1].split(',').map(function(value) {
//         return path.join(root,base,value);
//     });

//     return {
//         mime:MIME[path.extname(pathnames[0])] || 'text/plain',
//         pathnames:pathnames
//     };
// }
// main(process.argv.slice(2));


// const { spawn } = require('child_process');
// const ls = spawn('echo "The \\$HOME variable is $HOME"');

// ls.stdout.on('data', (data) => {
//   console.log(`输出：${data}`);
// });

// ls.stderr.on('data', (data) => {
//   console.log(`错误：${data}`);
// });

// ls.on('close', (code) => {
//   console.log(`子进程退出码：${code}`);
// });

// const EventEmitter = require('events');

// class MyEmitter extends EventEmitter {}

// const myEmitter = new MyEmitter();

// myEmitter.on('event',function(a,b){
//     // console.log('触发了一个事件');
//     console.log(a,b,this);
// });

// myEmitter.emit('event','a','b');
// myEmitter.on('event',(a,b) => {
//     setImmediate(() => {
//         console.log("这是个异步发生的");
//     });
// });
// myEmitter.emit('event','a','b');

// let m = 0;
// myEmitter.once('event',() => {
//     console.log(++m);
// });

// myEmitter.emit('event');

// myEmitter.emit('event');
// myEmitter.emit('error', new Error('出错了~~'));
// process.on('uncaughtException',(err) => {
//     console.log(err);
// });

// myEmitter.emit('error',new Error('出错了~~'));
// const myEmitter = new MyEmitter();

// myEmitter.on('error',(err)=>{
//     console.error('有错误');
// });

// myEmitter.emit('error',new Error('出错了~~'));
// const fs = require('fs');

// fs.unlink('/tmp/hello.txt',(err) => {
//     if(err) {
//         throw err;
//     }
//     console.log('成功删除/tmp/hello');
// })

// fs.rename('/tmp/hello/hello.txt','/tmp/hello/world.txt',(err) => {
//     if(err) {
//         console.log('重命名完成');
//     }
// });

// fs.stat('/tmp/hello/world.txt',(err,stats) => {
//     if(err) {
//         throw err;
//     }
//     console.log('文件属性: '+JSON.stringify(stats));
// });
// fs.rename('/tmp/hello/hello.txt','/tmp/hello/world.txt',(err) => {
//     if(err) {
//         throw err;
//     }
//     fs.stat('/tmp/hello/world.txt',(err,stats) => {
//         if(err) {
//             throw err;
//         }
//         console.log('文件属性：'+JSON.stringify(stats));
//     })
// });
// console.log(process.cwd());
// const fs = require('fs');
// const { URL } = require('url');
// const fileUrl = new URL('file:///tmp/hello/world.txt');

// fs.readFileSync(fileUrl,function(err,data) {

// });
// var fs = require('fs');
// fs.watch('/tmp/hello/world.txt',{encoding:'buffer'},(eventType,filename) => {
//     if (filename) {
//         console.log(filename);
//     }
// });
// fs.access('/tmp/hello/world.txt',(err) => {
//     console.log(err ? '没权限' : "可以读取");
// });

// fs.open('/tmp/hello/world.txt','wx',(err,fd) => {
//     if(err){
//         if(err.code == 'EEXIST') {
//             console.error('文件已经存在');
//             return;
//         }
//         throw err;
//     }
//     writeMyData(fd);
// });

// fs.appendFile('message.txt','data to append',(err) => {
//     if(err) {
//         throw err;
//     }
//     console.log('The "data to append" was appended to file!');
// });

// fs.copyFile('message.txt','test.txt',(err) => {
//     if(err) {
//         throw err;
//     }
//     console.log('message.txt 被复制到 text.txt');
// });

// var content = fs.createReadStream('message.txt',{start:90,end:99});
// console.log(content);

// console.log(fs.readFileSync('message.txt','utf-8'));

// const fd = fs.openSync('message.txt','r+');

// // fs.ftruncate(fd, 10, (err) => {
// //   // assert.ifError(err);
// //   console.log(fs.readFileSync('message.txt', 'utf8'));
// // });

// fs.readFile('/etc/passwd','utf8',(err,data) => {
//     if(err) {
//         throw err;
//     }
//     console.log(data);
// });

// const http = require('http');
// const keepAliveAgent = new http.Agent({keepAlive:true});
// options.agent = keepAliveAgent;

// http.request(options,onResponseCallback);
// querystring = require('querystring');
// http = require('http');
// const postData = querystring.stringify({
//   'msg' : 'Hello World!'
// });

// const options = {
//   hostname: 'www.google.com',
//   port: 80,
//   path: '/upload',
//   method: 'POST',
//   headers: {
//     'Content-Type': 'application/x-www-form-urlencoded',
//     'Content-Length': Buffer.byteLength(postData)
//   }
// };

// const req = http.request(options, (res) => {
//   console.log(`状态码: ${res.statusCode}`);
//   console.log(`响应头: ${JSON.stringify(res.headers)}`);
//   res.setEncoding('utf8');
//   res.on('data', (chunk) => {
//     console.log(`响应主体: ${chunk}`);
//   });
//   res.on('end', () => {
//     console.log('响应中已无数据。');
//   });
// });

// req.on('error', (e) => {
//   console.error(`请求遇到问题: ${e.message}`);
// });

// // 写入数据到请求主体
// req.write(postData);
// req.end();
// var net = require('net');
// const server = net.createServer((socket) => {
//   socket.end('goodbye\n');
// }).on('error',(err) => {
//   throw error;
// });

// server.listen( () => {
//   console.log('opened server on',server.address());
// }
// );

// var net = require('net');

// var HOST = '127.0.0.1';
// var PORT = 6969;

// net.createServer(function(sock) {
//   console.log('连接到客户端: '+ sock.remoteAddress + ":"+sock.remotePort);

//   // console.log(sock.getConnections());

//   sock.on('data',function(data) {
//     console.log('接收客户端数据 '+sock.remoteAddress+":"+data);
//     sock.write("发送给客户端数据 '"+data+"'");
//   });

//   sock.on('close',function(data) {
//     console.log('服务端关闭连接: '+' '+sock.remoteAddress+" "+sock.remotePort);
//   });
// }).listen(PORT,HOST);
// console.log('Server listening on '+HOST + ':'+PORT);

// var server = net.createServer();
// server.listen(PORT, HOST);
// console.log('Server listening on ' +
//     server.address().address + ':' + server.address().port);

// server.on('connection', function(sock) {

//     console.log('CONNECTED: ' +
//          sock.remoteAddress +':'+ sock.remotePort);
//     // 其它内容与前例相同

// });


// var client = new net.Socket();
// client.connect(PORT,HOST,function() {
//   console.log('客户端连接到: '+HOST+":"+PORT);
//   client.write('I am Chunk Norris!');
// });

// client.on('data',function(data) {
//   console.log('接收服务端数据: '+data);
//   client.destroy();
// });

// client.on('close',function() {
//   console.log('连接关闭');
// });

// const path = require('path');

// // var result = path.basename('/tmp/hello/world.txt');
// // var result = path.isAbsolute('/tmp/hello/world.txt');
// // var result = path.join('/foo','bar','baz/asdf','quux',"..");
// var result = path.parse('/home/user/dir/file.txt');

// // var result = path.format({
// //   root:'/ignored',
// //   dir:'/home/user/dir',
// //   base:'file.txt'
// // });
// console.log(result);

// const querystring = require('querystring');

// // var result = querystring.parse('w=测试&foo=bar', null, null);
// var result = querystring.stringify({foo:'bar',baz:['qux','quux'],corge:''});
// console.log(result);

// const stream = require('stream');

// const http = require('http');

// const server = http.createServer((req,res) => {
//   let body = '';

//   req.setEncoding('utf8');

//   req.on('data',(chunk) => {
//     body += chunk;
//   });

//   req.on('end',() => {
//     try{
//       const data = JSON.parse(body);
//       res.write(typeof data);
//       res.end();
//     } catch (er) {
//       res.statusCode = 400;
//       return res.end('error:'+er.message);
//     }
//   });
// });
// server.listen(1337);

// var fs = require('fs');

// var readable = fs.createReadStream('test.txt',{
//   flags:'r',
//   encoding:'utf8',
//   autoClose:true,
//   mode:0666,
// });

// readable.on('open',function(fd) {
//   console.log('文件被打开',fd);
// });

// readable.on('readable',function() {
//   console.log('接收到可读');
// });

// readable.on('data',function(chunk) {
//   console.log('已读 %d bytes %s',chunk.length,chunk);
// });

// readable.on('end',function() {
//   console.log('读取完毕');
// });

// readable.on('close',function() {
//   console.log('文件被关闭');
// });

// readable.on('error',function(err) {
//   console.log('错误发生: %s',err.message);
// });

// var fs = require('fs');
// var writable = fs.createWriteStream('test.txt',{
//   flags:'w',
//   defaultEncoding:'utf8',
//   mode:0666,
// });

// writable.on('finish',function() {
//   console.log('write finished');
//   // process.exit(0);
// });

// writable.write('My name is test','utf8');
// writable.end();

// var net = require('net');

// var server = net.createServer(function(sock) {
//   sock.setEncoding('utf8');
//   sock.on('pipe',function(src) {
//     console.log('piped');
//   });

//   sock.on('error',function(err) {
//     console.log('err - %s',err.message);
//   });
//   sock.pipe(sock);
// });

// server.maxConnections = 10;
// server.listen(8000,function() {
//   console.log('echo server bound at port - 8000');
// });

// var fs = require('fs');
// var path = require('path');
// var http = require('http');

// var MIME = {
//     '.css': 'text/css',
//     '.js': 'application/javascript'
// };

// function parseURL(root, url) {
//     var base, pathnames, parts;

//     if (url.indexOf('??') === -1) {
//         url = url.replace('/', '/??');
//     }

//     parts = url.split('??');
//     base = parts[0];
//     pathnames = parts[1].split(',').map(function (value) {
//         return path.join(root, base, value);
//     });

//     // console.log(pathnames);

//     return {
//         mime: MIME[path.extname(pathnames[0])] || 'text/plain',
//         pathnames: pathnames
//     };
// }

// http.createServer(function(req,res) {
//     var result = parseURL('/Users/anyone/Downloads/nodetest/test',req.url);

//     var output = [];
//     // console.log(result);


//     result.pathnames.forEach(function(file) {
//         fs.readFile(file,function(err,data) {
//             if(err) {
//                 // res.write(404);
//                 // res.end(err.message);
//                 res.end();
//             } else {
//                 output.push(data);
//                 console.log(data);
//             }
//         });
//     });
//     Buffer.concat(output);

//     // console.log(path1);
//     res.write("欢迎访问");
//     res.end();
// }).listen(8000);
// for(var i = 0; i < 5; i++){
//     (function(num) {
//         setTimeout(function(){
//             console.log(num);console.log("<br />");
//         // document.writeln(i);document.writeln("<br />");
//         },1000);
//     })(i);
// }

// var express = require('express');
// var app = express();

// app.get('/',function(req,res) {
//     res.send('hello world!');
// });

// app.listen(3000);

// var admin = express();

// admin.get('/',function(req,res) {
//     console.log(admin.mountpath);
//     res.send('Admin Homepage');
// });


// var secret = express();
// secret.get('/',function(req,res) {
//     console.log(secret.mountpath);
//     res.send('Admin Secret');
// });

// admin.use('/secr*t',secret);
// app.use(['/adm*n','/manager'],admin);

// app.param('id',function(req, res, next, id) {
//     console.log('第一次访问');
//     next();
// });

// app.get('/user/:id',function(req, res, next) {
//     console.log('尽管这个匹配');
//     next();
// });

// app.get('/user/:id',function(req, res) {
//     console.log('这个同样匹配');
//     res.end();
// });
// app.param(['id','page'],function(req,res,next,value) {
//     console.log('只能被访问一次',value);
//     next();
// });

// app.get('/user/:id/:page',function(req,res,next) {
//     console.log('尽管这个匹配');
//     next();
// });

// app.use(function(req,res,next) {
//     console.log('Time: %d',Date.now());
//     next();
// });
// app.get('/user/:id/:page',function(req,res,next) {
//     console.log('这个也匹配');
//     res.end();
// });

// var r1 = express.Router();
// r1.get('/',function(req,res,next) {
//     console.log('这是第一个');
//     next();
// });

// var r2 = express.Router();
// r2.get('/',function(req,res,next) {
//     console.log('这是第二个');
//     next();
// });
// app.use('/',[r1,r2]);

// app.listen(3000);


























































































































































